package dmon;

import java.io.IOException;
import java.net.Socket;

/**
 * Universidad Simón Bolívar
 * Curso de Redes I - Taller
 * Profesor: Ricardo Gonzalez
 * Trimestre Enero-Marzo 2011
 *
 * Proyecto 2 RD
 *
 * @author Grupo 9
 * @author Richard Simoes Ferreira
 * @author Ricardo Tocco
 *
 * @version 1.0
 *
 */
public class ErrorHandler {
    //Permite manejar los errores de dmon

    private ControlDmon control;

    /**
     * Constructor de la clase
     */
    public ErrorHandler (){
        control = null;
    }

    /**
     *  Obtiene la estructura de control dmon que está siendo utilizada por
     * el errorHandler
     * @return  la estructura de control que esta utilizando errorHandler
     */
    public ControlDmon getControlDmon(){
        return this.control;
    }

    /**
     * Establece la estructura de control dmon que usa errorHandler
     * @param c Estructura de control dmon
     */
    public void setControl(ControlDmon c){
        this.control = c;
    }

    /**
     * Imprime por salida estandar la ayuda de invocacion del programa,
     * si el mismo fue mal invocado y termina el programa.
     * @return void
     */

    public static void imprimirAyudaUsage () {
        System.out.println("\n+---- USAGE ----+\n\n");
        System.out.println("dmon -p <puerto local del monitor>\n\n");
        System.exit(-1);
    }

    /**
     * Error de argumentos
     */
    public void argumentosInvalidos (){
        System.out.println("ErrorHandler_Dmon: Se ha introducido un numero" +
                " inválido de" +
                " argumentos o algún argumento es desconocido");
        imprimirAyudaUsage();
    }

    /**
     * Error de parametros desconocidos o inválidos
     */
    public void parametroInvalido(){
        System.out.println("ErrorHandler_Dmon: Uno o más parámetros" +
                " inválidos se han introducido");
        imprimirAyudaUsage();
    }

    /**
     * Error al momento de abrir el socket servidor
     * @param e         Excepcion del sistema
     * @param puerto    Puerto al cual no ha podido establecer conexion
     */
    public void errorPuertoServerConnect(IOException e, int puerto){
        System.err.println("ErrorHandler_Dmon: No se ha podido abrir el " +
                "socket en el puerto "+puerto);
        System.exit(-1);
    }

    /**
     * Error al momento de cerrar el socket servidor
     * @param e         Excepcion del sistema
     */
    public void errorSocketServerDisconnect(IOException e){
        System.err.println("ErrorHandler_Dmon: No se ha podido cerrar el " +
                "socket del servidor correctamente");
        System.exit(-1);
    }

     /**
     * Ayuda con los comandos aceptados por consola
     */
    public static void imprimirAyudaConsola(){
        System.out.println("Consola Dmon v1.0");
        System.out.println("Comandos :\n-------------");
        System.out.println("tuser \nnops \nhelp\n--help\nq");
    }

    /**
     * El comando introducido por consola no se reconoce
     * @param comando   Comando que no ha podido ser reconocido
     */
    public void errorComandoDesconocido(String comando){
        System.err.println("ErrorHandler_Dmon: El comando introducido *"+
                comando+"* no es reconocido por favor intente de nuevo");
        imprimirAyudaConsola();

    }

    /**
     * Error de lectura en Consola
     * @param e         Excepcion del sistema
     * @param control   Estructura de control dmon
     */
    public void errorLecturaConsola(IOException e, ControlDmon control){
        System.err.println("ErrorHandler_Dmon: Se ha producido un " +
                "error de lectura en consola");
        System.exit(-1);
    }

    /**
     * Error al momento de leer mensaje del socket proviente del
     * drep correspondiente
     * @param control         ControlDmon de dmon
     * @param cliente         Socket Cliente drep
     */
    public void errorBufferGetLineaDrep(ControlDmon control, Socket cliente){
        System.err.println("ErrorHandler_Dmon: Se ha desconectado de forma" +
                " no esperada un servidor Drep. Decrementando el numero" +
                " de Dreps activos..... ");
    }
    /**
     * Error al momento de cerrar el BufferReader del socket del
     * drep correspondiente
     * @param e         Excepcion del sistema
     */
    public void errorCloseBufferGetLineaDrep(Exception e){
        System.err.println("ErrorHandler_Dmon: Problemas cerrando el" +
                    "BufferedReader de GetLinea de Drep");
    }

    /**
     * Error al momento de abrir el BufferedReader para leer mensaje del
     * socket proviente del drep correspondiente
     * @param control       ControlDmon
     * @param cliente       Socket del cliente drep
     */
    public void errorGetLineaDrep(ControlDmon control, Socket cliente){
        System.err.println("ErrorHandler_Dmon: No ha sido posible abrir" +
                " correctamente el BufferedReader para recibir el mensaje " +
                "esperado del cliente drep, puede que este caído o haya" +
                "cerrado su socket de comunicación");
    }

    /**
     * Error al momento de abrir el PrintWriter para enviar el mensaje al
     * socket del drep correspondiente
     * @param control         ControlDmon del dmon
     * @param e         Error del sistema
     */
    public void errorSendLineaDrep(ControlDmon control, IOException e){
        System.err.println("ErrorHandler_Dmon: No ha sido posible abrir" +
                " correctamente el PrintWriter para enviar el mensaje " +
                "esperado al cliente drep, puede que este caído o haya" +
                "cerrado su socket de comunicación");
    }

    /**
     * Error tratando de eliminar un usuario Dcli que no esta en la lista
     * @param usr   Usuario que no pertenece a la lista
     */
    public void errorUsuarioNoExiste(String usr){
        System.err.println("ErrorHandler_Dmon: El usuario "+usr+" no ha" +
                "podido eliminarse porque no pertenece a la lista de " +
                "dcli activos");
    }

    /**
     * Devuelve un mensaje de error cuando el puerto introducido en la línea de
     * comandos es inválido.
     *
     * @param puerto    el puerto inválido introducido
     */
    public void puertoInvalido(int puerto) {
        System.err.println("ErrorHandler_Dmon: Puerto "+puerto+" Inválido: " +
                "Debe ser mayor a 1023 y menor que 65536");
        System.exit(-1);
    }
}
